import { SignJWT, jwtVerify } from 'jose';
import config from '../config/jwtConfig.js'; // 导入配置
import { getNewDate } from '../utils/dateUtils.js';

// 使用JWT配置
const JWT_KEY = config.jwtKey;
const JWT_TIMEOUT = config.jwtTimeout;
const JWT_TIMEOUT_UNIT = config.jwtTimeoutUnit;

// 生成JWT
/**
 * 生成JWT
 * @param {Object} payload - 包含在JWT中的数据
 * @returns {Promise<string>} - 生成的JWT字符串
 */
export async function generateToken(payload) {
  // 从配置中获取JWT密钥
  const JWT_KEY = config.jwt.jwtKey;
  // 从配置中获取JWT过期时间
  const JWT_TIMEOUT = config.jwt.jwtTimeout;

  try {
    // 将JWT密钥转换为字节数组
    const secretKey = new TextEncoder().encode(JWT_KEY);

    // 创建一个新的JWT实例
    let jwt = new SignJWT(payload);

    // 设置JWT的保护头
    jwt = jwt.setProtectedHeader({ alg: 'HS256' });

    // 设置JWT的过期时间（相对当前时间）
    jwt = jwt.setExpirationTime(getNewDate(JWT_TIMEOUT, JWT_TIMEOUT_UNIT));

    // 使用密钥签名JWT
    const signedJwt = await jwt.sign(secretKey);

    return signedJwt; // 返回生成的JWT字符串
  } catch (error) {
    // 调试信息：生成JWT失败
    console.error('JWT生成失败:', error);
    throw error; // 抛出错误
  }
}

// 验证JWT
export async function verifyToken(token) {
  const secretKey = new TextEncoder().encode(JWT_KEY);
  try {
    const { payload } = await jwtVerify(token, secretKey);
    return payload;
  } catch (error) {
    console.error('JWT验证失败:', error); // 添加错误日志
    return null;
  }
}
